package com.the_last.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.the_last.pojo.po.Reservation;
import com.the_last.pojo.vo.ReservationTimeSlotInfo;
import com.the_last.pojo.vo.ReservationVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ReservationMapper extends BaseMapper<Reservation> {
    /**
     * 查询预约列表
     *
     * @param venueId 场馆ID
     * @param date    预约日期
     * @param status  预约状态
     * @param userId  用户ID
     * @param page    分页对象
     * @return 预约列表
     */
    IPage<ReservationVO> selectReservationList(
            @Param("venueId") Integer venueId,
            @Param("date") String date,
            @Param("status") Integer status,
            @Param("userId") Long userId,
            Page<ReservationVO> page
    );
    
    /**
     * 查询预约列表（不分页）
     *
     * @param venueId 场馆ID
     * @param date    预约日期
     * @param status  预约状态
     * @param userId  用户ID
     * @return 预约列表
     */
    List<ReservationVO> selectReservationList(
            @Param("venueId") Integer venueId,
            @Param("date") String date,
            @Param("status") Integer status,
            @Param("userId") Long userId
    );
    
    /**
     * 批量查询预约时间段信息
     *
     * @param reservationIds 预约ID列表
     * @return 时间段信息列表
     */
    List<ReservationTimeSlotInfo> selectTimeSlotInfo(@Param("reservationIds") List<String> reservationIds);
    
    /**
     * 获取指定周每天的预约数量统计 - 性能优化版本
     * 应用层预处理周一和周日日期，避免SQL中重复函数调用
     *
     * @param mondayDate 周一日期，格式为YYYY-MM-DD
     * @param sundayDate 周日日期，格式为YYYY-MM-DD
     * @return 每天的预约数量，按日期顺序返回7个整数（未来日期返回null）
     */
    List<Integer> getWeeklyReservationCounts(@Param("mondayDate") String mondayDate, @Param("sundayDate") String sundayDate);
}